<!DOCTYPE html>
<html lang="zh-cn"><head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    
    <link href="/css/bootstrap.min.css" rel="stylesheet">
    <link href="/css/main.css" rel="stylesheet">

    <link rel="shortcut icon" type="image/x-icon" href="/img/favicon.ico" />

    <title>Go程序的if-else结构 | wiseAI的小站</title>
</head><body><div class="container-fluid">
    <nav class="navbar fixed-top navbar-expand-sm navbar-dark bg-dark">
        <div class="container-fluid">
            <a class="navbar-brand" href="/">
                <img src="/img/favicon.ico" alt="" width="30" height="24" class="d-inline-block align-text-top">
                wiseAI的小站
            </a>
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/articles/">文章</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/categories/">分类</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/tags/">关键字</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/post/golang/">golang编程</a>
                    </li>
                    
                    <li class="nav-item">
                        <a  class="nav-link"   href="/about/">关于</a>
                    </li>
                    
                </ul>
                <form class="d-flex">
                    <input id="search-query" class="form-control me-2" type="search" placeholder="Search for anything..." aria-label="Search">
                </form>
            </div>
        </div>
    </nav>
</div>




<div id="content">
<div class="container article">
	<h1>Go程序的if-else结构</h1>
	<div class="post-meta">
		<div>
			
			
			By wiseai | 2022-07-08 | 3 minutes
		</div>
		<div class="tags">
			
			<a class="btn btn-light links btn-sm" href="/tags/%E7%BC%96%E7%A8%8B/">编程</a>
			
		</div>
	</div>
	<div>
		<div class="article-post">
			<h1 id="51-if-else-结构">5.1 if-else 结构</h1>
<p>if 是用于测试某个条件（布尔型或逻辑型）的语句，如果该条件成立，则会执行 if 后由大括号括起来的代码块，否则就忽略该代码块继续执行后续的代码。</p>
<pre tabindex="0"><code>if condition {
	// do something	
}
</code></pre><p>如果存在第二个分支，则可以在上面代码的基础上添加 <code>else</code> 关键字以及另一代码块，这个代码块中的代码只有在条件不满足时才会执行。<code>if</code> 和 <code>else</code> 后的两个代码块是相互独立的分支，只可能执行其中一个。</p>
<pre tabindex="0"><code>if condition {
	// do something	
} else {
	// do something	
}
</code></pre><p>如果存在第三个分支，则可以使用下面这种三个独立分支的形式：</p>
<pre tabindex="0"><code>if condition1 {
	// do something	
} else if condition2 {
	// do something else	
} else {
	// catch-all or default
}
</code></pre><p>else-if 分支的数量是没有限制的，但是为了代码的可读性，还是不要在 <code>if</code> 后面加入太多的 else-if 结构。如果你必须使用这种形式，则把尽可能先满足的条件放在前面。</p>
<p>即使当代码块之间只有一条语句时，大括号也不可被省略（尽管有些人并不赞成，但这还是符合了软件工程原则的主流做法）。</p>
<p>关键字 <code>if</code> 和 <code>else</code> 之后的左大括号 <code>{</code> 必须和关键字在同一行，如果你使用了 else-if 结构，则前段代码块的右大括号 <code>}</code> 必须和 else-if 关键字在同一行。这两条规则都是被编译器强制规定的。</p>
<p>非法的 Go 代码:</p>
<pre tabindex="0"><code>if x{
}
else {	// 无效的
}
</code></pre><p>要注意的是，在你使用 <code>gofmt</code> 格式化代码之后，每个分支内的代码都会缩进 4 个或 8 个空格，或者是 1 个 tab，并且右大括号与对应的 <code>if</code> 关键字垂直对齐。</p>
<p>在有些情况下，条件语句两侧的括号是可以被省略的；当条件比较复杂时，则可以使用括号让代码更易读。条件允许是符合条件，需使用 <code>&amp;&amp;</code>、<code>||</code> 或 <code>!</code>，你可以使用括号来提升某个表达式的运算优先级，并提高代码的可读性。</p>
<p>一种可能用到条件语句的场景是测试变量的值，在不同的情况执行不同的语句，不过将在第 5.3 节讲到的 switch 结构会更适合这种情况。</p>
<p>示例 5.1 <a href="examples/chapter_5/booleans.go">booleans.go</a></p>
<pre tabindex="0"><code>package main
import &#34;fmt&#34;
func main() {
	bool1 := true
	if bool1 {
		fmt.Printf(&#34;The value is true\n&#34;)
	} else {
		fmt.Printf(&#34;The value is false\n&#34;)
	}
}
</code></pre><p>输出：</p>
<pre><code>The value is true
</code></pre>
<p><strong>注意事项</strong> 这里不需要使用 <code>if bool1 == true</code> 来判断，因为 <code>bool1</code> 本身已经是一个布尔类型的值。</p>
<p>这种做法一般都用在测试 <code>true</code> 或者有利条件时，但你也可以使用取反 <code>!</code> 来判断值的相反结果，如：<code>if !bool1</code> 或者 <code>if !(condition)</code>。后者的括号大多数情况下是必须的，如这种情况：<code>if !(var1 == var2)</code>。</p>
<p>当 if 结构内有 <code>break</code>、<code>continue</code>、<code>goto</code> 或者 <code>return</code> 语句时，Go 代码的常见写法是省略 <code>else</code> 部分（另见<a href="05.2.md">第 5.2 节</a>）。无论满足哪个条件都会返回 <code>x</code> 或者 <code>y</code> 时，一般使用以下写法：</p>
<pre tabindex="0"><code>if condition {
	return x
}
return y
</code></pre><p><strong>注意事项</strong> 不要同时在 if-else 结构的两个分支里都使用 <code>return</code> 语句，这将导致编译报错 <code>function ends without a return statement</code>（你可以认为这是一个编译器的 Bug 或者特性）。（ <strong>译者注：该问题已经在 Go 1.1 中被修复或者说改进</strong> ）</p>
<p>这里举一些有用的例子：</p>
<ol>
<li>
<p>判断一个字符串是否为空：</p>
<ul>
<li><code>if str == &quot;&quot; { ... }</code></li>
<li><code>if len(str) == 0 {...}</code></li>
</ul>
</li>
<li>
<p>判断运行 Go 程序的操作系统类型，这可以通过常量 <code>runtime.GOOS</code> 来判断（<a href="02.2.md">第 2.2 节</a>）。</p>
<pre tabindex="0"><code>if runtime.GOOS == &#34;windows&#34;	 {
	.	..
} else { // Unix-like
	.	..
}
</code></pre><p>这段代码一般被放在 <code>init()</code> 函数中执行。这儿还有一段示例来演示如何根据操作系统来决定输入结束的提示：</p>
<pre tabindex="0"><code>var prompt = &#34;Enter a digit, e.g. 3 &#34;+ &#34;or %s to quit.&#34;

func init() {
	if runtime.GOOS == &#34;windows&#34; {
		prompt = fmt.Sprintf(prompt, &#34;Ctrl+Z, Enter&#34;)		
	} else { //Unix-like
		prompt = fmt.Sprintf(prompt, &#34;Ctrl+D&#34;)
	}
}
</code></pre></li>
<li>
<p>函数 <code>Abs()</code> 用于返回一个整型数字的绝对值:</p>
<pre tabindex="0"><code>func Abs(x int) int {
if x &lt; 0 {
	return -x
}
return x	
}
</code></pre></li>
<li>
<p><code>isGreater</code> 用于比较两个整型数字的大小:</p>
<pre tabindex="0"><code>func isGreater(x, y int) bool {
	if x &gt; y {
		return true	
	}
	return false
}
</code></pre></li>
</ol>
<p>在第四种情况中，<code>if</code> 可以包含一个初始化语句（如：给一个变量赋值）。这种写法具有固定的格式（在初始化语句后方必须加上分号）：</p>
<pre tabindex="0"><code>if initialization; condition {
	// do something
}
</code></pre><p>例如:</p>
<pre tabindex="0"><code>val := 10
if val &gt; max {
	// do something
}
</code></pre><p>你也可以这样写:</p>
<pre tabindex="0"><code>if val := 10; val &gt; max {
	// do something
}
</code></pre><p>但要注意的是，使用简短方式 <code>:=</code> 声明的变量的作用域只存在于 <code>if</code> 结构中（在 <code>if</code> 结构的大括号之间，如果使用 if-else 结构则在 <code>else</code> 代码块中变量也会存在）。如果变量在 <code>if</code> 结构之前就已经存在，那么在 <code>if</code> 结构中，该变量原来的值会被隐藏。最简单的解决方案就是不要在初始化语句中声明变量（见<a href="05.2.md">5.2 节的例 3</a> 了解更多)。</p>
<p>示例 5.2 <a href="examples/chapter_5/ifelse.go">ifelse.go</a></p>
<pre tabindex="0"><code>package main

import &#34;fmt&#34;

func main() {
	var first int = 10
	var cond int

	if first &lt;= 0 {
		fmt.Printf(&#34;first is less than or equal to 0\n&#34;)
	} else if first &gt; 0 &amp;&amp; first &lt; 5 {
		fmt.Printf(&#34;first is between 0 and 5\n&#34;)
	} else {
		fmt.Printf(&#34;first is 5 or greater\n&#34;)
	}
	if cond = 5; cond &gt; 10 {
		fmt.Printf(&#34;cond is greater than 10\n&#34;)
	} else {
		fmt.Printf(&#34;cond is not greater than 10\n&#34;)
	}
}
</code></pre><p>输出：</p>
<pre><code>first is 5 or greater
cond is not greater than 10
</code></pre>
<p>下面的代码片段展示了如何通过在初始化语句中获取函数 <code>process()</code> 的返回值，并在条件语句中作为判定条件来决定是否执行 <code>if</code> 结构中的代码：</p>
<pre tabindex="0"><code>if value := process(data); value &gt; max {
	...
}
</code></pre>
		</div>
	</div>
</div>


<div class="container">
    
    <div class="row">
        
        <div class="col-5">
            <a class="page-link link-dark text-end dh" href="/post/golang/2022.07.07-%E6%8E%A7%E5%88%B6%E7%BB%93%E6%9E%84/">
                <h5>前一篇</h5><br>
                Go程序的控制结构
            </a>            
        </div>
        
        <div class="col-2">
        </div>
        
        <div class="col-5">
            <a class="page-link link-dark text-start dh" href="/post/golang/2022.07.09-%E6%B5%8B%E8%AF%95%E5%A4%9A%E8%BF%94%E5%9B%9E%E5%80%BC%E5%87%BD%E6%95%B0%E7%9A%84%E9%94%99%E8%AF%AF/">
                <h5>后一篇</h5><br>
                Go程序的测试多返回值函数的错误
            </a>            
        </div>
        
    </div>
    
</div>

        </div><br><br>
<footer class="container">
    <h2>友情链接</h2>
    <hr>
    <nav class="nav nav-pills flex-column flex-sm-row">
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/gnzg/index.html" target="_blank">孤鸟之歌</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/mm/index.html" target="_blank">生成随机字符</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/md/index.html" target="_blank">MarkDown</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://gitee.com/" target="_blank">Gitee</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://github.com/" target="_blank">Github</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.aliyun.com/" target="_blank">阿里云</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://cloud.tencent.com/" target="_blank">腾讯云</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.oschina.net/" target="_blank">OSCHINA开源中国</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://gitee.com/wiseai/the-way-to-go_ZH_CN/blob/master/eBook/directory.md" target="_blank">the way to go</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://topgoer.com/" target="_blank">golang文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://goframe.org/display/gf" target="_blank">GoFrame</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.aliyundrive.com/" target="_blank">阿里云盘</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://cn.vuejs.org/" target="_blank">vue3文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://element-plus.gitee.io/zh-CN/" target="_blank">element-plus文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.runoob.com/vue3/vue3-tutorial.html" target="_blank">vue3菜鸟教程</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://v5.bootcss.com/" target="_blank">bootstrap v5 中文文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.bootstrap.cn/" target="_blank">bootstrap文档</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://caddy2.dengxiaolong.com/docs/" target="_blank">caddy中文教程</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.58pic.com/" target="_blank">千图</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://ifonts.com/" target="_blank">iFonts</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://marketing.qiniu.com/" target="_blank">七牛云</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.ixigua.com/" target="_blank">西瓜视频</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/yugang/index.html" target="_blank">鱼缸计算</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://justcc.mengkang.net/#/" target="_blank">C语言JustCC</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://wiseai.gitee.io/pages/pptist/" target="_blank">PPTist</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="/index.xml" target="_blank">RSS</a>
        
        <a class="flex-sm-fill text-sm-center nav-link links link-dark" href="https://www.kancloud.cn/idcpj/python/418553" target="_blank">参考资料</a>
        
    </nav>

    <div class="copyright text-center">
      <span class="power-by">
        Powered by <a class="links" href="https://gohugo.io" target="_blank">Hugo</a>
    </span>
    <span>|</span>
    <span>
        Theme - <a class="links" href="https://github.com/wiseai-go/blog-hugo" target="_blank">WiseAI</a>
    </span>
    <br>
    <span class="copyright-year">
        &copy;
        
        2017 -
        2023<span>
            陇ICP备15000157号
            
        </span></span>

</div>
</footer>
<script src="/js/bootstrap.bundle.min.js"></script>


</body>
</html>
